import Vue from 'vue';
import VueRouter from 'vue-router';
import { constantRoutes } from './constantRoutes';
import { getToken } from '@/libs/accessToken';
import NProgress from './config/nprogress'; // 进度条插件
import store from '@/store/index';
import { LOGIN_URL, ROUTER_WHITE_LIST, TITLE } from '@/global-config';

Vue.use(VueRouter);

// ** ---------- 重定向异常问题 ---------- **

/* 在创建router实例对象之前，手动覆盖原型链的push来吞掉报错catch */
/**
 * 解决同一个菜单重复点击报错问题
 */
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location, resolve, reject) {
  if (resolve || reject) return originalPush.call(this, location, resolve, reject);
  return originalPush.call(this, location).catch((e) => {});
};

// ** ---------- 重定向异常问题 End---------- **

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL, // 部署基路由
  routes: constantRoutes,
  scrollBehavior: () => ({ left: 0, top: 0 }) // 控制页面切换时的滚动行为
});

// 路由拦截
router.beforeEach(async (to, from, next) => {
  console.log('🚀🚀 ~ router.beforeEach ~ to, from:', to, from);
  // 1.NProgress 开始
  NProgress.start();
  // 2. token 存在
  let hasToken = getToken();

  // 没有 token && 存在白名单中 可放行
  if (!hasToken) {
    if (ROUTER_WHITE_LIST.includes(to.path)) {
      next();
    } else {
      // 非白名单的全部跳转登录页面，重新登录
      next(LOGIN_URL);
    }

    NProgress.done();
    return;
  }

  // 3. 有token && 去登录页面的直接放行
  if (to.path.toLocaleLowerCase() === LOGIN_URL) {
    next();
    NProgress.done();
    return;
  }

  // 有token && 想去其他页面 需要权限控制
  try {
    // 是否是管理员
    const isAdmin = store?.getters['user/isAdmin'] > 0;

    if (!isAdmin) {
      let hasRoles = store?.getters['user/roleIds']?.length > 0;
      if (!hasRoles) {
        // 获取角色并存储角色信息
        await store.dispatch('user/getUserInfo');
      }
    }

    // 权限菜单
    const hasMenu = store?.getters?.['permission/menuTree']?.length > 0;

    // 存在权限菜单
    if (hasMenu) {
      next();
    } else {
      //  根据角色获取可访问的路由
      const accessRoutes = await store?.dispatch('permission/generateRoutes');
      accessRoutes.forEach((item) => {
        router.addRoute(item);
      });

      if (from === '/' && to === '/dashboard') {
        next({ path: '/home' });
      } else {
        next({ ...to, replace: true });
      }

      alert(1);
    }
  } catch (err) {
    // 异常重置token，重新登录
    console.warn('路由守卫中异常', err);
    // localStorage.clear()
    next(LOGIN_URL);
  } finally {
    NProgress.done();
  }

  // // 可以修改浏览器的标题
  // document.title = to?.meta?.title ?? TITLE;

  // next()
});
router.afterEach(() => {
  NProgress.done();
});

export default router;
